package ui.graphical;

import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusListener;
import java.awt.event.MouseListener;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;

import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import logic.Logic;
import logic.rule.PersoonRules;
import domain.Persoon;

public class Personen extends GuiBaseFrame implements ActionListener, MouseListener, FocusListener {

	private static final long serialVersionUID = -8374800377275480784L;

	private JTextField txtVoornaam,txtAchternaam,txtAdres,txtPostcode;
	private JTextField txtWoonplaats,txtGeboortedatum,txtTaal,txtRekeningnummer,txtEmail;
	
	private JRadioButton rdbtnDeelnemer,rdbtnMedewerker,rdbtnGids;
	private ButtonGroup btngrpType;
	
	private JRadioButton rdbtnVrouw,rdbtnMan;
	private ButtonGroup btngrpGeslacht;

	
	public Personen(Logic logic) {
		super(logic, "Personen");
			
		createGUI();	
	}
	
	public void dispatchList(Object object) {
		persoon2Scherm((Persoon) object);		
	}
	
	
	public void actionPerformed(ActionEvent e) {
		
		super.actionPerformed(e);
		
		if(e.getSource().equals(zoekVeld)||e.getSource().equals(rdbtnDeelnemer)||e.getSource().equals(rdbtnGids)||e.getSource().equals(rdbtnMedewerker)) {
			zoekPersonen();
		}
		else if(e.getSource().equals(btnToevoegen)) {
			nieuwePersoon();
		}
		else if(e.getSource().equals(btnOpslaan)) {
			savePersoon();
		}
		else if(e.getSource().equals(btnVerwijderen)) {
			verwijderPersoon();
		}

		
	}
	private void zoekPersonen() {
		String typePersoon = geselecteerdType();
		if(typePersoon==null) {
			UIHelper.errorMsg("U moet een type selecteren");
		} else {
			List<Persoon> results = logic.zoekPersonen(typePersoon,"%"+zoekVeld.getText()+"%");
			((DefaultListModel)listOverview.getModel()).removeAllElements();
			for(Persoon persoon: results) {
				((DefaultListModel)listOverview.getModel()).addElement(persoon);
			}
		}
	}
	
	private String geselecteerdType() {
		String Type = null;
		if(rdbtnDeelnemer.isSelected()) {
			Type = "D";
		} else if(rdbtnMedewerker.isSelected()) {
			Type = "M";
		} else if(rdbtnGids.isSelected()) {
			Type = "G";
		}
			
		return Type;
	}
	
	private void verwijderPersoon() {
		Persoon persoon = (Persoon) getSelectedObject();
		if(persoon!=null) {
			if(UIHelper.confirm("Weet u zeker dat u deze persoon wilt verwijderen?")) {
				try {
					logic.verwijderPersoon(persoon);
					zoekPersonen();
				} catch (SQLException e) {
					UIHelper.errorMsg(e.getMessage());
				}
			}
		} else {
			UIHelper.errorMsg("U heeft niemand geselecteerd");
		}
	}
	
	private void savePersoon() {
		if(UIHelper.confirm("Weet u zeker dat u deze persoon wilt opslaan?")) {
			Persoon persoon = (Persoon) getSelectedObject();
			if(persoon==null) {
				persoon = new Persoon();
			}
			try {
				scherm2Persoon(persoon);
				PersoonRules.checkPersoon(persoon);
				logic.savePersoon(persoon);
				zoekPersonen();
			} catch (SQLException e) {
				UIHelper.errorMsg(e.getMessage());
			}
		}
	}
	

	private void nieuwePersoon() {
		listOverview.clearSelection();
		persoon2Scherm(null);
	}
	private void persoon2Scherm(Persoon persoon) {
		txtVoornaam.setText((persoon!=null)?persoon.getVoornaam():"");
		txtAchternaam.setText((persoon!=null)?persoon.getAchternaam():"");
		txtAdres.setText((persoon!=null)?persoon.getAdres():"");
		txtPostcode.setText((persoon!=null)?persoon.getPostcode():"");
		txtWoonplaats.setText((persoon!=null)?persoon.getWoonplaats():"");
		txtGeboortedatum.setText((persoon!=null)? UIHelper.date2string(persoon.getGeboortedatum()):"");
		txtTaal.setText((persoon!=null)?persoon.getTaal():"");
		txtRekeningnummer.setText((persoon!=null)?persoon.getBankaccount():"");
		txtEmail.setText((persoon!=null)?persoon.getEmail():"");
		
		String geslacht = "";
		if(persoon!=null && persoon.getGeslacht()!=null) { 
			geslacht = persoon.getGeslacht(); 
		}
		if(geslacht.equals("M")) {
			rdbtnMan.setSelected(true);
		}
		else if(geslacht.equals("V")) {
			rdbtnVrouw.setSelected(true);
		}
		else {
			btngrpGeslacht.clearSelection();
		}
		
		
	}
	private  void scherm2Persoon(Persoon persoon) {
		persoon.setVoornaam(txtVoornaam.getText());
		persoon.setAchternaam(txtAchternaam.getText());
		persoon.setAdres(txtAdres.getText());
		persoon.setPostcode(txtPostcode.getText());
		persoon.setWoonplaats(txtWoonplaats.getText());
		persoon.setEmail(txtEmail.getText());
		try {
			persoon.setGeboortedatum(UIHelper.string2date(txtGeboortedatum.getText()));
		} catch (SQLException e) {
			persoon.setGeboortedatum(null);
		}
		persoon.setTaal(txtTaal.getText());
		persoon.setBankaccount(txtRekeningnummer.getText());
		if(rdbtnMan.isSelected()) { 
			persoon.setGeslacht("M");
		} else if(rdbtnVrouw.isSelected()) {
			persoon.setGeslacht("V");
		}
		
		if(rdbtnDeelnemer.isSelected()) { 
			persoon.setType("D");
		} else if(rdbtnMedewerker.isSelected()) {
			persoon.setType("M");
		} else if(rdbtnGids.isSelected()) {
			persoon.setType("G");
		}
		
	}
	
	


	private void createGUI() {
		
		JLabel lblZoekPersoon = new JLabel("Zoek persoon");
		lblZoekPersoon.setBounds(10, 14, 87, 14);
		getContentPane().add(lblZoekPersoon);
		
		JPanel nawpanel = new JPanel();
		nawpanel.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
		nawpanel.setBounds(10, 257, 760, 307);
		getContentPane().add(nawpanel);
		nawpanel.setLayout(null);
		
		JLabel lblVoornaam = new JLabel("Voornaam");
		lblVoornaam.setBounds(10, 11, 70, 14);
		nawpanel.add(lblVoornaam);
		
		txtVoornaam = new JTextField();
		txtVoornaam.setBounds(129, 8, 166, 20);
		nawpanel.add(txtVoornaam);
		txtVoornaam.setColumns(20);
		
		JLabel lblAchternaam = new JLabel("Achternaam");
		lblAchternaam.setBounds(10, 36, 70, 14);
		nawpanel.add(lblAchternaam);
		
		JLabel lblAdres = new JLabel("Adres");
		lblAdres.setBounds(10, 61, 46, 14);
		nawpanel.add(lblAdres);
		
		JLabel lblPostcode = new JLabel("Postcode");
		lblPostcode.setBounds(10, 86, 46, 14);
		nawpanel.add(lblPostcode);
		
		JLabel lblWoonplaats = new JLabel("Woonplaats");
		lblWoonplaats.setBounds(10, 111, 70, 14);
		nawpanel.add(lblWoonplaats);
		
		JLabel lblGeslacht = new JLabel("Geslacht");
		lblGeslacht.setBounds(10, 136, 46, 14);
		nawpanel.add(lblGeslacht);
		
		JLabel lblGeboortedatum = new JLabel("Geboortedatum");
		lblGeboortedatum.setBounds(10, 161, 100, 14);
		nawpanel.add(lblGeboortedatum);
		
		JLabel lblTaal = new JLabel("Taal");
		lblTaal.setBounds(10, 186, 46, 14);
		nawpanel.add(lblTaal);
		
		JLabel lblRekeningnummer = new JLabel("Rekeningnummer");
		lblRekeningnummer.setBounds(10, 211, 100, 14);
		nawpanel.add(lblRekeningnummer);
		
		txtAchternaam = new JTextField();
		txtAchternaam.setBounds(129, 33, 166, 20);
		nawpanel.add(txtAchternaam);
		txtAchternaam.setColumns(20);
		
		txtAdres = new JTextField();
		txtAdres.setBounds(129, 58, 166, 20);
		nawpanel.add(txtAdres);
		txtAdres.setColumns(20);
		
		txtPostcode = new JTextField();
		txtPostcode.setBounds(129, 83, 86, 20);
		nawpanel.add(txtPostcode);
		txtPostcode.setColumns(7);
		
		txtWoonplaats = new JTextField();
		txtWoonplaats.setBounds(129, 108, 166, 20);
		nawpanel.add(txtWoonplaats);
		txtWoonplaats.setColumns(20);
		
		rdbtnMan = new JRadioButton("Man");
		rdbtnMan.setBounds(129, 132, 46, 23);
		nawpanel.add(rdbtnMan);
		
		rdbtnVrouw = new JRadioButton("Vrouw");
		rdbtnVrouw.setBounds(180, 132, 109, 23);
		nawpanel.add(rdbtnVrouw);
		
		btngrpGeslacht = new ButtonGroup();
		btngrpGeslacht.add(rdbtnMan);
		btngrpGeslacht.add(rdbtnVrouw);
		
		txtGeboortedatum = new JTextField();
		txtGeboortedatum.setBounds(129, 158, 86, 20);
		nawpanel.add(txtGeboortedatum);
		txtGeboortedatum.setColumns(10);
		
		txtTaal = new JTextField();
		txtTaal.setBounds(129, 183, 86, 20);
		nawpanel.add(txtTaal);
		txtTaal.setColumns(10);
		
		txtRekeningnummer = new JTextField();
		txtRekeningnummer.setBounds(129, 208, 86, 20);
		nawpanel.add(txtRekeningnummer);
		txtRekeningnummer.setColumns(10);
		
		JLabel lblEmail = new JLabel("E-mail");
		lblEmail.setBounds(10, 236, 53, 14);
		nawpanel.add(lblEmail);
		
		txtEmail = new JTextField();;
		txtEmail.setBounds(129, 233, 166, 20);
		nawpanel.add(txtEmail);
		txtEmail.setColumns(10);
				
		rdbtnDeelnemer = new JRadioButton("Deelnemer");
		rdbtnDeelnemer.setBackground(SystemColor.inactiveCaptionText);
		rdbtnDeelnemer.setBounds(406, 10, 77, 23);
		getContentPane().add(rdbtnDeelnemer);
		
		rdbtnMedewerker = new JRadioButton("Medewerker");
		rdbtnMedewerker.setBackground(SystemColor.inactiveCaptionText);
		rdbtnMedewerker.setBounds(490, 10, 87, 23);
		getContentPane().add(rdbtnMedewerker);
		
		rdbtnGids = new JRadioButton("Gids");
		rdbtnGids.setBackground(SystemColor.inactiveCaptionText);
		rdbtnGids.setBounds(582, 10, 52, 23);
		getContentPane().add(rdbtnGids);
		
		rdbtnDeelnemer.addActionListener(this);
		rdbtnGids.addActionListener(this);
		rdbtnMedewerker.addActionListener(this);

		btngrpType = new ButtonGroup();
		btngrpType.add(rdbtnDeelnemer);
		btngrpType.add(rdbtnGids);
		btngrpType.add(rdbtnMedewerker);	
		
	}
}
